package com.tonann.app.service;

import com.tonann.app.VO.DeviceDashboardVO;
import com.tonann.app.domain.AppDevice;
import com.tonann.app.domain.AppDevicePlaces;
import com.tonann.app.domain.AppTreeSelect;
import com.tonann.common.core.domain.entity.SysPlace;
import com.tonann.common.core.domain.entity.SysUser;

import java.util.List;

/**
 * 运行设备Service接口
 *
 * @author tonann
 * @date 2022-10-12
 */
public interface IAppDeviceService
{
    /**
     * 查询运行设备
     *
     * @param deviceId 运行设备主键
     * @return 运行设备
     */
    public AppDevice selectAppDeviceByDeviceId(Long deviceId);

    /**
     * 查询运行设备列表
     *
     * @param appDevice 运行设备
     * @return 运行设备集合
     */
    public List<AppDevice> selectAppDeviceList(AppDevice appDevice);

    /**
     * 新增运行设备
     *
     * @param appDevice 运行设备
     * @return 结果
     */
    public AppDevice insertAppDevice(AppDevice appDevice) throws Exception;

    /**
     * 修改运行设备
     *
     * @param appDevice 运行设备
     * @return 结果
     */
    public int updateAppDevice(AppDevice appDevice) throws Exception;

    /**
     * 修改运行设备
     *
     * @param appDevice 运行设备
     * @return 结果
     */
    public int updateAppDeviceStatus(AppDevice appDevice);

    /**
     * 批量删除运行设备
     *
     * @param deviceIds 需要删除的运行设备主键集合
     * @return 结果
     */
    public int deleteAppDeviceByDeviceIds(Long[] deviceIds);

    /**
     * 删除运行设备信息
     *
     * @param deviceId 运行设备主键
     * @return 结果
     */
    public int deleteAppDeviceByDeviceId(Long deviceId);

    /**
     * 查询设备树结构信息
     *
     * @param appDevice 设备信息
     * @return 设备树信息集合
     */
    public List<AppTreeSelect> selectAppDeviceTreeList(AppDevice appDevice);

    /**
     * 构建前端所需要树结构
     *
     * @param appDevices 设备列表
     * @return 树结构列表
     */
    public List<AppDevice> buildAppDeviceTree(List<AppDevice> appDevices);

    /**
     * 构建前端所需要下拉树结构
     *
     * @param appDevices 设备列表
     * @return 下拉树结构列表
     */
    public List<AppTreeSelect> buildAppDeviceTreeSelect(List<AppDevice> appDevices);

    /**
     * 根据设备ID查询设备树信息
     *
     * @param deviceId 设备ID
     * @return 选中设备列表
     */
    public List<Long> selectAppDeviceDeptListByDeviceId(Long deviceId);

    public List<Long> selectAppDevicePlaceListByDeviceId(Long deviceId);

    public List<Long> selectAppDeviceAdminListByDeviceId(Long deviceId);

    public List<Long> selectAppDeviceOperatorListByDeviceId(Long deviceId);

    /**
     * 根据ID查询所有子设备（正常状态）
     *
     * @param appDeviceId 设备ID
     * @return 子设备数
     */
    public int selectNormalChildrenAppDeviceById(Long appDeviceId);

    /**
     * 是否存在设备子节点
     *
     * @param appDeviceId 设备ID
     * @return 结果
     */
    public boolean hasChildByAppDeviceId(Long appDeviceId);

    /**
     * 查询设备是否存在用户
     *
     * @param appDeviceId 设备ID
     * @return 结果 true 存在 false 不存在
     */
    public boolean checkAppDeviceExistUser(Long appDeviceId);

    /**
     * 校验设备名称是否唯一
     *
     * @param appDevice 设备信息
     * @return 结果
     */
    public String checkAppDeviceNameUnique(AppDevice appDevice);

    public void checkDeviceDataScope(Long deviceId);

    public int authDataScope(AppDevice device);

    public void checkDevicePlaceScope(Long deviceId);

    public int authPlaceScope(AppDevice device);

    public List<AppDevice> selectAppDeviceAll(AppDevice device);

    List<AppDevice> selectAppDeviceByDeviceName(String trim);

    public DeviceDashboardVO getIndexExhaust(Long projectId);

    List<AppDevice> selectWxDeviceList(SysUser sysUser);

    List<SysPlace> selectDevicePlaceByDeviceId(Long deviceId);

    List<AppDevice> selectDeviceListByUserId(Long userId);

    List<Long> selectAdminPhoneByDeviceId(Long deviceId);

    List<AppDevice> selectDeviceListIsShow();

    List<AppDevice> selectChildrenAppDeviceById(Long deviceId);

    List<AppDevice> selectAppDeviceListSimple(AppDevice appDevice);

    List<SysUser> selectUserByDeviceId(Long deviceId, String userType);

    AppDevice selectAppDeviceByDeviceCode(String deviceCode);

    List<AppDevicePlaces> selectAppDevicePlaceListByDeviceIds(List<Long> deviceIds);
}
